TStream spatne zapisuje string
Otázka od: Pavel Hauptman
20. 8. 2004 11:00
Zdravim vsechny,
rad bych se zeptal, jak spravne zapisovat string pomoci TStream. Pouzivam
nasledujici kod a do souboru se mi zapisuji uplne nesmyslne stringy.
FillChar(veta1, SizeOf(veta1), #0);
veta1.lngh := cdsPTEX.Fields[0].AsInteger;
veta1.walo := cdsPTEX.Fields[1].AsInteger;
veta1.tnum := cdsPTEX.Fields[2].AsInteger;
veta1.text := cdsPTEX.Fields[3].AsString;
// tady koukam do debuggeru a hodnota veta1.text je v poradku.
fout.Write(veta1.lngh, 2);
fout.Write(veta1.walo, 2);
fout.Write(veta1.tnum, 4);
fout.Write(veta1.text, Length(veta1.text));
//tady koukam do debuggeru a hodnota veta1.text je opet v poradku, ale
do souboru se zapise nesmysl.
Kde delam chybu?
Diky a s pozdravem
Pavel Hauptman
Odpovedá: Ales Vasicek
20. 8. 2004 11:07
Ahoj,
Musis pouzit tuto konstrukci:
fout.Write(Pointer(veta1.text)^, Length(veta1.text));
Ales
> -----Original Message-----
> From: Pavel Hauptman [mailto:phauptman@bilbo.cz]
>
> rad bych se zeptal, jak spravne zapisovat string pomoci
> TStream. Pouzivam
> nasledujici kod a do souboru se mi zapisuji uplne nesmyslne stringy.
>
> FillChar(veta1, SizeOf(veta1), #0);
> veta1.lngh := cdsPTEX.Fields[0].AsInteger;
> veta1.walo := cdsPTEX.Fields[1].AsInteger;
> veta1.tnum := cdsPTEX.Fields[2].AsInteger;
> veta1.text := cdsPTEX.Fields[3].AsString;
> // tady koukam do debuggeru a hodnota veta1.text je v poradku.
> fout.Write(veta1.lngh, 2);
> fout.Write(veta1.walo, 2);
> fout.Write(veta1.tnum, 4);
> fout.Write(veta1.text, Length(veta1.text));
Odpovedá: Jiri Foldyna
20. 8. 2004 11:22
> rad bych se zeptal, jak spravne zapisovat string pomoci
> TStream. Pouzivam
> nasledujici kod a do souboru se mi zapisuji uplne nesmyslne stringy.
>
> FillChar(veta1, SizeOf(veta1), #0);
> veta1.lngh := cdsPTEX.Fields[0].AsInteger;
> veta1.walo := cdsPTEX.Fields[1].AsInteger;
> veta1.tnum := cdsPTEX.Fields[2].AsInteger;
> veta1.text := cdsPTEX.Fields[3].AsString;
> // tady koukam do debuggeru a hodnota veta1.text je v poradku.
> fout.Write(veta1.lngh, 2);
> fout.Write(veta1.walo, 2);
> fout.Write(veta1.tnum, 4);
> fout.Write(veta1.text, Length(veta1.text));
> //tady koukam do debuggeru a hodnota veta1.text je opet v
> poradku, ale
> do souboru se zapise nesmysl.
>
> Kde delam chybu?
Ahoj,
zapisujes do souboru pointer na string. Ja to delam takto:
Zapis:
function WriteToStream(Value : integer; fs : TFileStream) : boolean;
// write integer
begin
Result := fs.write(Value, SizeOf(Value)) = SizeOf(Value);
end;
function WriteToStream(Value : string; fs : TFileStream) : boolean;
// write string
begin
Result := WriteToStream(Length(Value), fs);
if Result then
begin
Result := fs.write(Value[1], Length(Value)) = Length(Value);
end;
end;
Cteni:
function ReadFromStream(var Value : integer; fs : TFileStream) : boolean;
// read integer
begin
Result := fs.read(Value, SizeOf(Value)) = SizeOf(Value);
end;
function ReadFromStream(var Value : string; fs : TFileStream) : boolean;
// read string
var
i : integer;
begin
Result := ReadFromStream(i, fs);
if Result then
begin
SetLength(Value, i);
Result := fs.read(Value[1], i) = i;
end;
end;
Zdravim
Jiri Foldyna
Odpovedá: Miso
20. 8. 2004 11:37
----- Original Message -----
From: "Pavel Hauptman" <phauptman@bilbo.cz>
> rad bych se zeptal, jak spravne zapisovat string pomoci TStream. Pouzivam
> nasledujici kod a do souboru se mi zapisuji uplne nesmyslne stringy.
>
..ak chces zapisat string do suboru cez stream, tak sa inspiruj napr. tymto
:
function TXXX.WriteData(const Data: WideString): Integer;
var f : TFileStream;
ss : TStringStream;
begin
result := -1;
try
try
if Append then
begin
if FileExists(FullPath) then
f := TFileStream.Create(FullPath, fmOpenReadWrite or
fmShareDenyWrite)
else
f := TFileStream.Create(FullPath, fmCreate or fmShareDenyWrite);
f.Seek(0, soFromEnd);
end
else
f := TFileStream.Create(FullPath, fmCreate or fmShareDenyWrite);
ss := TStringStream.Create(Data);
try
f.CopyFrom(ss, ss.Size);
finally
FreeAndNil(ss);
end;
finally
FreeAndNil(f);
end;
except on e:Exception do
begin
ShowMessage('Error : '+ e.Message);
exit;
end;
end;
result := 0;
end;
Miso